" Vim syntax file
" Language:     Markdown
" Author:       Ben Williams <benw@plasticboy.com>
" Maintainer:   Hallison Batista <email@hallisonbatista.com>
" URL:          http://plasticboy.com/markdown-vim-mode/
" Version:      1.0.1
" Last Change:  Fri Dec  4 08:36:48 AMT 2009
" Remark:       Uses HTML syntax file
" Remark:       I don't do anything with angle brackets (<>) because that would too easily
"               easily conflict with HTML syntax
" TODO: Handle stuff contained within stuff (e.g. headings within blockquotes)

" Read the HTML syntax to start with
"if version < 600
"  so <sfile>:p:h/html.vim
"else
"  runtime! syntax/html.vim
"  unlet b:current_syntax
"endif

"if version < 600
"  syntax clear
"elseif exists("b:current_syntax")
"  finish
"endif

" Don't use standard HiLink, it will not work with included syntax files
"if version < 508
"  command! -nargs=+ HtmlHiLink hi link <args>
"else
"  command! -nargs=+ HtmlHiLink hi def link <args>
"endif

syntax spell toplevel
syntax case ignore
syntax sync linebreaks=1

" Additions to HTML groups
"syntax region htmlBold    start=/\\\@<!\(^\|\A\)\@=\*\@<!\*\*\*\@!\S/  end=/\S\\\@<!\*\@<!\*\*\*\@!\($\|\A\)\@=/  contains=htmlItalic,@Spell
syntax region ModeMsg    start=/\\\@<!\(^\|\A\)\@=\*\@<!\*\*\*\@!\S/  end=/\S\\\@<!\*\@<!\*\*\*\@!\($\|\A\)\@=/


"syntax region htmlItalic  start=/\\\@<!\(^\|\A\)\@=\*\@<!\*\*\@!\S/    end=/\S\\\@<!\*\@<!\*\*\@!\($\|\A\)\@=/    contains=htmlBold,@Spell
"syntax region htmlItalic  start=/\\\@<!\(^\|\A\)\@=\<_\@<!___\@!\S/      end=/\S\\\@<!_\@<!___\@!\($\|\A\)\@=/       contains=htmlBold,@Spell
"syntax region htmlItalic  start=/\\\@<!\(^\|\A\)\@=\<_\@<!__\@!\S/       end=/\S\\\@<!_\@<!__\@!\($\|\A\)\@=/       contains=htmlBold,@Spell
"syntax region htmlBold  start=/\\\@<!\(^\|\A\)\@=\*\@<!\*\*\@!\S/    end=/\S\\\@<!\*\@<!\*\*\@!\($\|\A\)\@=/    contains=htmlBold,@Spell
"syntax region htmlBold  start=/\\\@<!\(^\|\A\)\@=\<_\@<!___\@!\S/      end=/\S\\\@<!_\@<!___\@!\($\|\A\)\@=/       contains=htmlBold,@Spell
"syntax region htmlBold  start=/\\\@<!\(^\|\A\)\@=\<_\@<!__\@!\S/       end=/\S\\\@<!_\@<!__\@!\($\|\A\)\@=/       contains=htmlBold,@Spell

" [link](URL) | [link][id] | [link][]
"syntax region mkdLink matchgroup=mkdDelimiter start="\!\?\["  end="\]\ze\s*[[(]" contains=@Spell nextgroup=mkdURL,mkdID skipwhite
"syntax region mkdID   matchgroup=mkdDelimiter start="\["      end="\]" contained
"syntax region mkdURL  matchgroup=mkdDelimiter start="("       end=")"  contained

" Link definitions: [id]: URL (Optional Title)
" TODO handle automatic links without colliding with htmlTag (<URL>)
"syntax region mkdLinkDef matchgroup=mkdDelimiter   start="^ \{,3}\zs\[" end="]:" oneline nextgroup=mkdLinkDefTarget skipwhite
"syntax region mkdLinkDefTarget start="<\?\zs\S" excludenl end="\ze[>[:space:]\n]"   contained nextgroup=mkdLinkTitle,mkdLinkDef skipwhite skipnl oneline
"syntax region mkdLinkTitle matchgroup=mkdDelimiter start=+"+     end=+"+  contained
"syntax region mkdLinkTitle matchgroup=mkdDelimiter start=+'+     end=+'+  contained
"syntax region mkdLinkTitle matchgroup=mkdDelimiter start=+(+     end=+)+  contained

" Define Markdown groups
"syntax match  mkdLineContinue ".$" contained
"syntax match  mkdRule      /^\s*\*\s\{0,1}\*\s\{0,1}\*$/
"syntax match  mkdRule      /^\s*-\s\{0,1}-\s\{0,1}-$/
"syntax match  mkdRule      /^\s*_\s\{0,1}_\s\{0,1}_$/
"syntax match  mkdRule      /^\s*-\{3,}$/
"syntax match  mkdRule      /^\s*\*\{3,5}$/
"syntax match  mkdListItem  /^\s*[-*+]\s\+.*\n\(\(^.\+\n\)*\n\?\)\(\(^\(\s\{4}\|\t\)\+.*\n\)\(^.\+\n\)*\n\?\)*/ contains=mkdListCode,mkdCode,htmlBold,htmlItalic,htmlSpecialChar
"syntax match  mkdListItem  /^\s*\d\+\.\s\+.*\n\(\(^.\+\n\)*\n\?\)\(\(^\(\s\{4}\|\t\)\+.*\n\)\(^.\+\n\)*\n\?\)*/ contains=mkdListCode,mkdCode,htmlBold,htmlItalic,htmlSpecialChar
"
"syntax match  mkdBlockCode  /^\s*\n\(^\(\s\{4}\|\t\).*\n\)\+/
"syntax match  mkdListCode   /^\s*\n\(^\(\s\{8}\|\t{2}\).*\n\)\+/
"syntax match  mkdLineBreak /  \+$/
"syntax region mkdCode       start=/\\\@<!`/     end=/\\\@<!`/
"syntax region mkdCode       start=/\s*``[^`]*/  end=/[^`]*``\s*/
"syntax region mkdBlockquote start=/^\s*>/       end=/$/           contains=mkdLineBreak,mkdLineContinue,@Spell
"syntax region mkdCode       start="<pre[^>]*>"  end="</pre>"
"syntax region mkdCode       start="<code[^>]*>" end="</code>"

" HTML headings
syntax region LineNr       start="^\s*#"                   end="\($\|#\+\)" contains=@Spell
syntax region Question   start="^\s*##"                  end="\($\|#\+\)" contains=@Spell
"syntax region htmlH3       start="^\s*###"                 end="\($\|#\+\)" contains=@Spell
"syntax region htmlH4       start="^\s*####"                end="\($\|#\+\)" contains=@Spell
"syntax region htmlH5       start="^\s*#####"               end="\($\|#\+\)" contains=@Spell
"syntax region htmlH6       start="^\s*######"              end="\($\|#\+\)" contains=@Spell
syntax match  LineNr       /^.\+\n=\+$/ contains=@Spell
syntax match  LineNr       /^.\+\n-\+$/ contains=@Spell

"highlighting for Markdown groups
"HtmlHiLink mkdString        String
"HtmlHiLink mkdCode          String
"HtmlHiLink mkdListCode      String
"HtmlHiLink mkdBlockCode     String
"HtmlHiLink mkdBlockquote    Comment
"HtmlHiLink mkdLineContinue  Comment
"HtmlHiLink mkdListItem      Identifier
"HtmlHiLink mkdRule          Identifier
"HtmlHiLink mkdLineBreak     Todo
"HtmlHiLink mkdLink          htmlLink
"HtmlHiLink mkdURL           htmlString
"HtmlHiLink mkdID            Identifier
"HtmlHiLink mkdLinkDef       mkdID
"HtmlHiLink mkdLinkDefTarget mkdURL
"HtmlHiLink mkdLinkTitle     htmlString

"HtmlHiLink mkdDelimiter     Delimiter

let b:current_syntax = "markdown"

"delcommand HtmlHiLink
" vim: tabstop=2
